最大连续子序列和
描述
给出一个整数序列S，其中有N个数，定义其中一个非空连续子序列T中所有数的和为T的“序列和”。 
对于S的所有非空连续子序列T，求最大的序列和。 变量条件：N为正整数，N≤1000000，结果序列和在范围（-2^63,2^63-1）以内。
输入描述：
第一行为一个正整数N，第二行为N个整数，表示序列中的数。
输出描述：
输入可能包括多组数据，对于每一组输入数据， 仅输出一个数，表示最大序列和。
示例1
输入：
5
1 5 -3 2 4

6
1 -2 3 4 -10 6

4
-3 -1 -2 -5

输出：
9
7
-1


#include<bits/stdc++.h>
using namespace std;

const int MAXN=1e6+10;
const int INF=INT_MAX;

long long arr[MAXN];
long long Fun1(int n){//朴素递归会超时O(n^2)
    long long answer;
    if(n==0){
        answer=arr[n];
    }else{
        answer=max(arr[n],Fun1(n-1)+arr[n]);
    }
    return answer;
}

long long memo[MAXN];//递归+记忆数组O(n)
long long Fun2(int n){
    if(memo[n]!=-1){
        return memo[n];
    }
    long long answer;
    if(n==0){
        answer=arr[n];
    }else{
        answer=max(arr[n],Fun2(n-1)+arr[n]);
    }
    memo[n]=answer;
    return answer;
}

long long dp[MAXN];//递推求解O(1)
void Fun3(int n){
    for(int i=0;i<n;++i){
        long long answer;
        if(i==0){
            answer=arr[i];
        }else{
            answer=max(arr[i],dp[i-1]+arr[i]);
        }
        dp[i]=answer;
    }
    return;
}


int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;++i){
            scanf("%lld",&arr[i]);
        }

        //递归
        //long long maxinum=-INF;
        // for(int i=0;i<n;++i){
        //     maxinum=max(maxinum,Fun1(i));
        // }
        // printf("%lld\n",maxinum);
        
        //递归+记忆
        // fill(memo,memo+n,-1);
        // long long maxinum=-INF;
        // for(int i=0;i<n;++i){
        //     maxinum=max(maxinum,Fun2(i));
        // }
        // printf("%lld\n",maxinum);

        //递推
        fill(dp,dp+n,-1);
        long long maxinum=-INF;
        Fun3(n);
        for(int i=0;i<n;++i){
            maxinum=max(maxinum,dp[i]);
        }
        printf("%lld\n",maxinum);
    }
    return 0;
}


#include<bits/stdc++.h>
using namespace std;

const int Max=INT_MAX;

int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        long long arr[n];
        long long maxnum=-Max;
        long long sum=0;
        for(int i=0;i<n;++i){
            scanf("%lld",&arr[i]);
        }
        for(int i=0;i<n;++i){
            sum+=arr[i];
            if(sum>maxnum){
                maxnum=sum;
            }
            if(sum<0){
                sum=0;
            }
        }
        printf("%lld\n",maxnum);
    }
    return 0;
}
